////////////////////////////////////////////////////////////////////////////
//
//  CryEngine Source File.
//  Copyright (C), Crytek Studios, 2001-2010.
// -------------------------------------------------------------------------
//  File name:   CustomMemoryHeap.h
//  Version:     v1.00
//  Created:     17/08/2010 by Timur.
// -------------------------------------------------------------------------
//  History:
//
////////////////////////////////////////////////////////////////////////////

#include <StdAfx.h>
#include "CustomMemoryHeap.h"












//////////////////////////////////////////////////////////////////////////
CCustomMemoryHeapBlock::CCustomMemoryHeapBlock( CCustomMemoryHeap *pHeap )
: m_pHeap(pHeap),
	m_pData(0),
	m_nSize(0),
	m_nGPUHandle(0)
{
}

//////////////////////////////////////////////////////////////////////////
CCustomMemoryHeapBlock::~CCustomMemoryHeapBlock()
{
	m_pHeap->DeallocateBlock(this);
}

//////////////////////////////////////////////////////////////////////////
void *CCustomMemoryHeapBlock::GetData()
{





	return m_pData; 
}

//////////////////////////////////////////////////////////////////////////
void CCustomMemoryHeapBlock::CopyMemoryRegion( void *pOutputBuffer,size_t nOffset,size_t nSize )
{
	assert( nOffset+nSize <= m_nSize );
	if (nOffset+nSize <= m_nSize)
	{









		{
			memcpy( pOutputBuffer,(uint8*)m_pData + nOffset,nSize );
		}
	}
	else
	{
		CryFatalError( "Bad CopyMemoryRegion range" );
	}
}

//////////////////////////////////////////////////////////////////////////
ICustomMemoryBlock* CCustomMemoryHeap::AllocateBlock( size_t nAllocateSize,const char *sUsage )
{
	CCustomMemoryHeapBlock *pBlock = new CCustomMemoryHeapBlock(this);
	pBlock->m_sUsage = sUsage;
	pBlock->m_nSize = nAllocateSize;







































	pBlock->m_pData = malloc(nAllocateSize);


	CryInterlockedAdd( &m_nAllocatedSize,nAllocateSize );

	return pBlock;
}

//////////////////////////////////////////////////////////////////////////
void CCustomMemoryHeap::AllocateHeap( size_t const nSize,char const* const sUsage )
{





















}

//////////////////////////////////////////////////////////////////////////
void CCustomMemoryHeap::DeallocateBlock( CCustomMemoryHeapBlock* pBlock )
{























	free( pBlock->m_pData );


	int nAllocateSize = (int)pBlock->m_nSize;
	CryInterlockedAdd( &m_nAllocatedSize,-nAllocateSize );
}

//////////////////////////////////////////////////////////////////////////
void CCustomMemoryHeap::GetMemoryUsage( ICrySizer *pSizer )
{
	if (!m_bUseGPUMemory)
	{
		pSizer->AddObject( this,m_nAllocatedSize );
	}
}

//////////////////////////////////////////////////////////////////////////
CCustomMemoryHeap::CCustomMemoryHeap( bool bCanUseGPUMemory )
{
	m_nAllocatedSize = 0;
	m_bUseGPUMemory = false;
	m_nTraceHeapHandle = 0;





}

//////////////////////////////////////////////////////////////////////////
CCustomMemoryHeap::~CCustomMemoryHeap()
{




}

//////////////////////////////////////////////////////////////////////////
void CCustomMemoryHeap::Defrag()
{











}